home *** CD-ROM | disk | FTP | other *** search
/ PC Media 2 / PC MEDIA CD02.iso / proein / trick / graph320.pas < prev    next >
Pascal/Delphi Source File  |  1994-09-15  |  27KB  |  999 lines

  1. Unit Graph320;
  2.  
  3. Interface
  4.  
  5. Uses Crt,Dos,Graph,VarAnima;
  6.  
  7. Var Peque,Peque2:Integer;
  8.  
  9. Procedure GetImgVirtual(GetCoordX1,GetCoordY1,GetCoordX2,GetCoordY2:Word;PantFondo,GTImagen:Pointer);
  10. Procedure PutImgVirtual(PutCoordX,PutCoordY:Word;PantFondo,PtImagen:Pointer);
  11. Procedure Linea(PrinX,PrinY,FinalX,FinalY:Word;Color:Byte);
  12. Procedure Clear;
  13. Procedure PintaPantalla(Pantalla:Pointer);
  14. Procedure PutImg(CoordX,CoordY:Word; Imagen:Pointer);
  15. Procedure PutSilueta(CoordX,CoordY:Word; Imagen:Pointer);
  16. Procedure GetImg(CoordX1,CoordY1,CoordX2,CoordY2:Word;Imagen:Pointer);
  17. Procedure CargaPaleta(Imagen:String8);
  18. Procedure Efecto(NumeroEfecto:Byte;PasarANegro:Boolean;Pantalla2:Pointer);
  19. Procedure Enciende_Luz;
  20. Procedure Fundido_a_Negro_Total;
  21. Procedure Fundido_a_Negro_Parcial(NumCol:Byte);
  22. Procedure Fundido_de_Negro_Total(NumeroPaleta:Word;NombrePaleta:String8);
  23. Procedure Fundido_de_Negro_Parcial(NumCol:Byte);
  24. Procedure ActualizaPaleta(IndicePaleta:Byte);
  25. Procedure CambiaPaleta(DePaleta,APaleta:Paleta);
  26. Procedure CambiaBloqueRGB(PrimerColor:Byte;NumColores:Word;Var RGB);
  27. Procedure Procesando_Activo;
  28.  
  29. Implementation
  30.  
  31. Var
  32.  ExitGraph:Pointer;
  33.  Autodetect:Pointer;
  34.  RegGraph:Registers;
  35.  DatosFundido:Array [0..63, 1..64] Of ShortInt;
  36.  IPal,JPal:Byte;
  37.  
  38. Procedure GetImgVirtual(GetCoordX1,GetCoordY1,GetCoordX2,GetCoordY2:Word;PantFondo,GTImagen:Pointer);
  39. Var
  40.  PosAbs       : Word;
  41.  TamanioFondo : Array [1..2]  of Word;
  42. Begin
  43.  TamanioFondo[1]:=Abs(GetCoordX2-GetCoordX1);
  44.  TamanioFondo[2]:=Abs(GetCoordY2-GetCoordY1);
  45.  Move(TamanioFondo,GTImagen^,4);
  46.  PosAbs:=Ofs(PantFondo^)+4+GetCoordX1+GetCoordY1*320;
  47.   asm
  48.       { Captura la imagen desde la dirección de pantFondo en Imagen }
  49.      mov  BX,word ptr [PantFondo+2]
  50.      mov  ES,BX
  51.      mov  BX,Word ptr [GTImagen+2]
  52.      mov  SI,Word ptr [GTImagen]
  53.      mov  AX,word ptr [PosAbs] { Offset de la imagen }
  54.      mov  DI,AX
  55.      push DS
  56.      mov  DS,BX
  57.      mov  CX,word ptr DS:[SI+2] { Altura  de la imagen }
  58.      inc  CX
  59.      mov  BX,word ptr DS:[SI] { Ancho  de la imagen }
  60.      add  SI,4
  61.      inc  BX
  62. @L2:
  63.      push CX
  64.      mov  CX,BX { Ancho  de la imagen }
  65. @L1:
  66.      push CX
  67.      mov  AL,ES:[DI]
  68.      mov  DS:[SI],AL
  69.      inc  SI
  70.      inc  DI
  71.      pop  CX
  72.      loop @L1
  73.      pop  CX
  74.      add  DI,320
  75.      sub  DI,BX
  76.      loop @L2
  77.      pop  DS
  78.    end;
  79. End;
  80.  
  81. Procedure PutImgVirtual(PutCoordX,PutCoordY:Word;PantFondo,PtImagen:Pointer);
  82. Var
  83.  PutPosAbs :Word;
  84. Begin
  85.  PutPosAbs:=PutCoordX+PutCoordY*320+Ofs(PantFondo^)+4;
  86.   asm
  87.       { Pinta la imagen desde la dirección del dibujo en DirDib
  88.                        en la posición absoluta PosAbs }
  89.      mov  BX,word ptr [PantFondo+2]
  90.      mov  ES,BX
  91.      mov  BX,Word ptr [PTImagen+2]
  92.      mov  SI,Word ptr [PTImagen]
  93.      mov  AX,word ptr [PutPosAbs] { Offset de la imagen }
  94.      mov  DI,AX
  95.      push DS
  96.      mov  DS,BX
  97.      mov  CX,word ptr DS:[SI+2] { Altura  de la imagen }
  98.      inc  CX
  99.      add  SI,4
  100.      mov  BX,word ptr DS:[SI-4] { Ancho  de la imagen }
  101.      inc  BX
  102.      mov  AX,320
  103.      sub  AX,BX   { número de puntos para el comienzo de la siguiente línea}
  104. @L2:
  105.      push CX
  106.      mov  CX,BX   { Ancho  de la imagen }
  107.      rep  movsb   { Pinta una línea }
  108.      pop  CX
  109.      add  DI,AX
  110.      loop @L2
  111.      pop  DS
  112.    end;
  113. End;
  114.  
  115. Procedure GetImg(CoordX1,CoordY1,CoordX2,CoordY2:Word;Imagen:Pointer);
  116. Var
  117.  PosAbs:Word;
  118.  TamanioFondo:Array [1..2] of Word;
  119. Begin
  120.  TamanioFondo[1]:=Abs(CoordX2-CoordX1);
  121.  TamanioFondo[2]:=Abs(CoordY2-CoordY1);
  122.  Move(TamanioFondo,Imagen^,4);
  123.  PosAbs:=CoordX1+CoordY1*320;
  124.   asm
  125.       { Captura la imagen desde la dirección del dibujo en DirDib
  126.                          en la posición absoluta PosAbs }
  127.      mov  BX,Word ptr Imagen+2
  128.      mov  SI,Word ptr Imagen
  129.      mov  AX,word ptr PosAbs { Offset de la imagen }
  130.      mov  DI,AX
  131.      push DS
  132.      mov  DS,BX
  133.      mov  CX,word ptr DS:[SI+2] { Altura  de la imagen }
  134.      inc  CX
  135.      mov  BX,0A000h
  136.      mov  ES,BX
  137.      mov  BX,word ptr DS:[SI] { Ancho  de la imagen }
  138.      add  SI,4
  139.      inc  BX
  140. @L2:
  141.      push CX
  142.      push BX
  143.      mov  CX,BX { Ancho  de la imagen }
  144. @L1:
  145.      mov  BL,ES:[DI]
  146.      mov  DS:[SI],BL
  147.      inc  SI
  148.      inc  DI
  149.      loop @L1
  150.      pop  BX
  151.      pop  CX
  152.      add  DI,320
  153.      sub  DI,BX
  154.      loop @L2
  155.      pop  DS
  156.    end;
  157. End;
  158.  
  159. Procedure PutSilueta(CoordX,CoordY:Word; Imagen:Pointer);
  160. Var
  161.  PosAbs :Word;
  162. Begin
  163.  PosAbs:=CoordX+CoordY*320;
  164.   asm
  165.       {   Pinta el dibujo sin fondo                                }
  166.       {   desde la dirección del dibujo en DirDib                  }
  167.       {   a la posición absoluta PosAbs                            }
  168.      mov  BX,Word ptr Imagen+2
  169.      mov  SI,Word ptr Imagen
  170.      mov  AX,word ptr PosAbs { Offset de la imagen }
  171.      mov  DI,AX
  172.      push DS
  173.      mov  DS,BX
  174.      mov  CX,word ptr DS:[SI+2] { Altura  de la imagen }
  175.      sub  CX,1   { ????????????????????????? }
  176.      add  SI,4
  177.      mov  BX,0A000h
  178.      mov  ES,BX
  179.      mov  BX,word ptr DS:[SI-4] { Ancho  de la imagen }
  180.      inc  BX     { ????????????? }
  181. @L2:
  182.      push CX
  183.      push BX
  184.      mov  CX,BX { Ancho  de la imagen }
  185. @L1:
  186.      push CX
  187.      cmp  DI,AX
  188.      jnb  @L4
  189.        {Acabar el procedimiento }
  190. @L4:
  191.      mov  BL,DS:[SI]         { Si el color no es cero pone el punto }
  192.      cmp  BL,0
  193.      je   @L3
  194.      mov  ES:[DI],BL
  195. @L3:
  196.      Inc  SI
  197.      inc  DI
  198.      pop  CX
  199.      loop @L1
  200.      pop  BX
  201.      pop  CX
  202.      add  DI,320
  203.      sub  DI,BX
  204.      loop @L2
  205.      pop  DS
  206.    end;
  207. End;
  208.  
  209. Procedure PintaPantalla(Pantalla:Pointer);
  210. Begin
  211.   asm
  212.      push DS
  213.      mov  SI,Word ptr Pantalla
  214.      add  SI,4
  215.      mov  DX,Word ptr Pantalla+2
  216.      mov  DS,DX
  217.      xor  DI,DI     { Comienzo del buffer de video (desplazamiento) }
  218.      mov  DX,0A000h { Segmento de video         }
  219.      mov  ES,DX
  220.      mov  CX,22400  { Pantalla  completa a mover}
  221.      rep  movsw
  222.      pop  DS
  223.    end;
  224. End;
  225.  
  226. Procedure PutImg(CoordX,CoordY:Word; Imagen:Pointer);
  227. Var
  228.  PosAbs :Word;
  229. Begin
  230.  PosAbs:=CoordX+CoordY*320;
  231.   asm
  232.       { Pinta la imagen desde la dirección del dibujo en DirDib
  233.                        en la posición absoluta PosAbs }
  234.      mov  BX,Word ptr Imagen+2
  235.      mov  SI,Word ptr Imagen
  236.      mov  AX,word ptr PosAbs { Offset de la imagen }
  237.      mov  DI,AX
  238.      push DS
  239.      mov  DS,BX
  240.      mov  CX,word ptr DS:[SI+2] { Altura  de la imagen }
  241.      inc  CX
  242.      add  SI,4
  243.      mov  BX,0A000h
  244.      mov  ES,BX
  245.      mov  BX,word ptr DS:[SI-4] { Ancho  de la imagen }
  246.      inc  BX
  247.      mov  AX,320
  248.      sub  AX,BX   { número de puntos para el comienzo de la siguiente línea}
  249.      push DX
  250.      push AX
  251.      push CX
  252.      mov  DX,3DAh
  253. @L6:
  254.      in   AL,DX
  255.      test AL,8
  256.      loopnz @L6
  257.      pop CX
  258.      pop AX
  259.      pop DX
  260.  
  261. @L2:
  262.      push CX
  263.      mov  CX,BX   { Ancho  de la imagen }
  264.      rep  movsb   { Pinta una línea }
  265.      pop  CX
  266.      add  DI,AX
  267.      loop @L2
  268.      pop  DS
  269.    end;
  270. End;
  271.  
  272. Procedure Linea(PrinX,PrinY,FinalX,FinalY:Word;Color:Byte);
  273. Var
  274.  IncrYDiag,
  275.  IncrXDiag,
  276.  DistCorta,
  277.  IncrXRecto,
  278.  IncrYRecto,
  279.  ContRecto,
  280.  ContDiag    : Word;
  281. Begin
  282.  asm
  283.   mov  DX,1
  284.   mov  CX,1
  285.   mov  DI,FinalY
  286.   sub  DI,PrinY
  287.   jge  @GuardaY
  288.   neg  CX
  289.   neg  DI
  290. @GuardaY:
  291.   mov  IncrYDiag,CX
  292.   mov  SI,FinalX
  293.   sub  SI,PrinX
  294.   jge  @GuardaX
  295.   neg  DX
  296.   neg  SI
  297. @GuardaX:
  298.   mov  IncrXDiag,DX
  299.   cmp  SI,DI
  300.   jge  @SegHoriz
  301.   mov  DX,0
  302.   xchg SI,DI
  303.   jmp  @GuardaValor
  304. @SegHoriz:
  305.   mov  CX,0
  306. @GuardaValor:
  307.   mov  DistCorta,DI
  308.   mov  IncrXRecto,DX
  309.   mov  IncrYRecto,CX
  310.   mov  AX,DistCorta
  311.   shl  AX,1
  312.   mov  ContRecto,AX
  313.   sub  AX,SI
  314.   mov  BX,AX
  315.   sub  AX,SI
  316.   mov  ContDiag,AX
  317.   mov  DX,PrinX
  318.   mov  CX,PrinY
  319.   inc  SI
  320.   inc  SI
  321.   mov  AL,Color
  322.   mov  DI,0A000h
  323.   mov  ES,DI
  324. @Bucle:
  325.   dec  SI
  326.   jz   @Acabada
  327.  
  328.    push CX
  329.    Xor  DI,DI
  330.    cmp  CX,0
  331.    jz   @Continua
  332. @NumCol:
  333.    add  DI,320
  334.    loop @NumCol
  335. @Continua:
  336.    Add  DI,DX
  337.    mov  ES:[DI],al
  338.    pop  CX
  339.  
  340.   cmp  bx,0
  341.   jge  @Diagonal
  342.   add  DX,IncrXRecto
  343.   add  CX,IncrYRecto
  344.   add  BX,ContRecto
  345.   jmp  @Bucle
  346. @Diagonal:
  347.   add  DX,IncrXDiag
  348.   add  CX,IncrYDiag
  349.   add  BX,ContDiag
  350.   jmp  @Bucle
  351. @Acabada:
  352.  End;
  353. End;
  354.  
  355. Procedure Clear; Assembler;
  356. asm
  357.   mov AX,$700
  358.   mov BH,0
  359.   mov CX,0
  360.   mov DH,25
  361.   mov DL,40
  362.   int $10
  363. end;
  364.  
  365. Procedure CargaPaleta(Imagen:String8);
  366. Var Fichero:File of Paleta;
  367. Begin
  368.  Assign(Fichero,Imagen+'.PAL');
  369.  {$I-} Reset(Fichero); {$I+}
  370.  If IOResult<>0 Then Halt(310);
  371.  Read(Fichero,Pal);
  372.  Close(Fichero);
  373.  RegGraph.AX:=$1012;
  374.  RegGraph.BX:=0;
  375.  RegGraph.CX:=256;
  376.  If ContadorPC>89 Then Halt(274);
  377.  RegGraph.ES:=Seg(Pal);
  378.  RegGraph.DX:=Ofs(Pal);
  379.  Intr($10,RegGraph);
  380. End;
  381.  
  382. Procedure MCGADriver; External;
  383. {$L VGA256.OBJ}
  384.  
  385. Procedure PequeFont; External;
  386. {$L Litt.OBJ}
  387.  
  388. Procedure EuroFont; External;
  389. {$L Euro.obj}
  390.  
  391. Function DetectVGA:Integer; Far;
  392. Var Driver,Modo:Integer;
  393. Begin
  394.  DetectGraph(Driver,Modo);
  395.  DetectVGA:=Driver;
  396.  If ((Driver<>VGA) and (Driver<>MCGA))
  397.   Then Halt(256);
  398. End;
  399.  
  400. Procedure Inicializa;
  401. Var
  402.  GD,GM:Integer;
  403.  PalKK:PaletteType;
  404. Begin
  405.  AutoDetect:=@DetectVGA;
  406.  GD:=InstallUserDriver('VGA256',AutoDetect);
  407.  GM:=Detect;
  408.  If RegisterBGIDriver(@MCGADriver)<0
  409.   Then Halt(308);
  410.  If RegisterBGIFont(@PequeFont)<0
  411.   Then Halt(309);
  412.  Peque:=InstallUserFont('Litt');
  413.  If RegisterBGIFont(@EuroFont)<0
  414.   Then Halt(309);
  415.  Peque2:=InstallUserFont('Euro');
  416.  InitGraph(GD,GM,'');
  417.  PalKK.Size:=16;
  418.  For GM:=0 to 15 do
  419.   PalKK.Colors[GM]:=GM;
  420.  SetAllPalette(PalKK);
  421.  Setcolor(255);
  422. End;
  423.  
  424. Procedure GraphSalida;Far;
  425. Begin
  426.  ExitProc:=ExitGraph;
  427.  CloseGraph;
  428. End;
  429.  
  430. Procedure Efecto(NumeroEfecto:Byte;PasarANegro:Boolean;Pantalla2:Pointer);
  431. Var
  432.  I1,I2,I3:Word;
  433.  J1,J2,J3:Word;
  434.  OldColor:Byte;
  435.  FillInfoMIO:FillSettingsType;
  436.  PalPaso:Paleta;
  437. Begin
  438.  OldColor:=GetColor;
  439.  GetFillSettings(FillInfoMIO);
  440.  ContadorPC2:=ContadorPC;
  441.  If ContadorPC>145 Then Halt(274);
  442.  If PasarANegro
  443.   Then
  444.    Case NumeroEfecto of
  445.     1:Begin {Efecto de cortina de arriba a abajo}
  446.        SetColor(0);
  447.        For I1:=0 to 69 do
  448.         Begin
  449.          Line(0,(I1*2),319,(I1*2));
  450.          Delay(5);
  451.         End;
  452.        For I1:=70 Downto 1 do
  453.         Begin
  454.          Line(0,(I1*2-1),319,(I1*2-1));
  455.          Delay(5);
  456.         End;
  457.       End;
  458.     2:Begin {Efecto de cortina de abajo a arriba}
  459.        SetColor(0);
  460.        For I1:=70 Downto 1 do
  461.         Begin
  462.          Line(0,(I1*2-1),319,(I1*2-1));
  463.          Delay(5);
  464.         End;
  465.        For I1:=0 to 69 do
  466.         Begin
  467.          Line(0,(I1*2),319,(I1*2));
  468.          Delay(5);
  469.         End;
  470.       End;
  471.     3:Begin { Cuadritos }
  472.        SetFillStyle(1,0);
  473.        For I2:=1 to 9 do
  474.         Begin
  475.          I1:=10;
  476.          Repeat
  477.           J1:=10;
  478.           Repeat
  479.            Bar((I1-I2),(J1-I2),(I1+I2),(J1+I2));
  480.            Inc(J1,20);
  481.           Until J1=150;
  482.           Inc(I1,20);
  483.          Until I1=330;
  484.         End;
  485.        Bar(0,0,319,139);
  486.       End;
  487.     4:Begin {Cuadros en cascada}
  488.        SetFillStyle(1,0);
  489.        For I2:=1 to 22 do
  490.         Begin
  491.          For I1:=1 to 16 do
  492.           For J1:=1 to 7 do
  493.            Begin
  494.             If ((I1+J1)=(I2+1))
  495.              Then
  496.               Begin
  497.                Bar(((I1-1)*20),((J1-1)*20),((I1-1)*20+19),((J1-1)*20+19));
  498.                Delay(8);
  499.               End;
  500.            End;
  501.         End;
  502.       End;
  503.     5:Begin {Espiral}
  504.        SetColor(0);
  505.         For J1:=0 to 139 do
  506.          Line(0,J1,319,(139-J1));
  507.         For J1:=318 Downto 1 do
  508.          Line(J1,0,(319-J1),139);
  509.       End;
  510.     6:Begin {Fundido hacia dentro}
  511.        SetColor(0);
  512.        For I1:=0 to 70 do
  513.         Begin
  514.          Rectangle(I1,I1,(319-I1),(139-I1));
  515.          Delay(5);
  516.         End;
  517.       End;
  518.     7:Begin {Fundido hacia fuera}
  519.        SetColor(0);
  520.        For I1:=70 Downto 0 do
  521.         Rectangle(I1,I1,(319-I1),(139-I1));
  522.       End;
  523.     8:Begin {Linea tipo guillotina centrada en 0,139}
  524.        SetColor(0);
  525.        For I1:=0 to 319 do
  526.         Line(0,139,I1,0);
  527.        For I1:=1 to 139 do
  528.         Line(0,139,319,I1);
  529.       End;
  530.     9:Begin {Linea tipo guillotina centrada en 319,0}
  531.        SetColor(0);
  532.        For I1:=319 Downto 0 do
  533.         Line(319,139,I1,0);
  534.        For I1:=1 to 139 do
  535.         Line(319,139,0,I1);
  536.       End;
  537.    10:Begin {Cuadrados en zigzag}
  538.        SetFillStyle(1,0);
  539.        For J1:=1 to 7 do
  540.         If ((J1 Mod 2)=0)
  541.          Then
  542.           For I1:=1 to 16 do
  543.            Begin
  544.             Bar(((I1-1)*20),((J1-1)*20),((I1-1)*20+19),((J1-1)*20+19));
  545.             Delay(8);
  546.            End
  547.          Else
  548.           For I1:=16 Downto 1 do
  549.            Begin
  550.             Bar(((I1-1)*20),((J1-1)*20),((I1-1)*20+19),((J1-1)*20+19));
  551.             Delay(8);
  552.            End;
  553.       End;
  554.    11:Begin {Cuadros en espiral}
  555.        SetFillStyle(1,0);
  556.        For I2:=0 to 3 do
  557.         Begin
  558.          J1:=1+I2;
  559.          For I1:=(1+I2) to (16-I2) do {Derecha}
  560.           Begin
  561.            Bar(((I1-1)*20),((J1-1)*20),((I1-1)*20+19),((J1-1)*20+19));
  562.            Delay(8);
  563.           End;
  564.          For J1:=(2+I2) to (7-I2) do {Abajo}
  565.           Begin
  566.            Bar(((I1-1)*20),((J1-1)*20),((I1-1)*20+19),((J1-1)*20+19));
  567.            Delay(8);
  568.           End;
  569.          For I1:=(16-I2) Downto (1+I2) do {izquierda}
  570.           Begin
  571.            Bar(((I1-1)*20),((J1-1)*20),((I1-1)*20+19),((J1-1)*20+19));
  572.            Delay(8);
  573.           End;
  574.          For J1:=(6-I2) Downto (2+I2) do {Arriba}
  575.           Begin
  576.            Bar(((I1-1)*20),((J1-1)*20),((I1-1)*20+19),((J1-1)*20+19));
  577.            Delay(8);
  578.           End;
  579.         End;
  580.       End;
  581.    12:Begin { Aleatorio }
  582.        SetFillStyle(1,0);
  583.        SetColor(0);
  584.        For I1:=1 to 15000 do
  585.         Begin
  586.          I2:=Random(318);
  587.          J2:=Random(138);
  588.          Bar(I2,J2,(I2+2),(J2+2));
  589.          PutPixel(Random(320),Random(139),0);
  590.         End;
  591.        Bar(0,0,319,139);
  592.       End;
  593.    13:Begin {Cortina vertical a izq}
  594.        SetColor(0);
  595.        For I1:=319 Downto 0 do
  596.         Line(I1,0,I1,139);
  597.       End;
  598.    14:Begin { Cortina vertical a dcha }
  599.        SetColor(0);
  600.        For I1:=0 to 319 do
  601.         Line(I1,0,I1,139);
  602.       End;
  603.    15:Begin  {apagado de tele}
  604.        SetColor(0);
  605.        For J1:=0 to 70 do
  606.          Begin
  607.           Move(Ptr($A000,(J1*320))^,Ptr($A000,((J1+1)*320))^,320);
  608.           Line(0,J1,319,J1);
  609.           Move(Ptr($A000,((139-J1)*320))^,Ptr($A000,((138-J1)*320))^,320);
  610.           Line(0,(139-J1),319,(139-J1));
  611.           Delay(2);
  612.          End;
  613.        Delay(5);
  614.        For J1:=0 to 160 do
  615.         Begin
  616.          Line(0,68,J1,68);
  617.          Line(319,68,(319-J1),68);
  618.         End;
  619.       End;
  620.    End
  621.   Else
  622.    Case NumeroEfecto of
  623.     1:Begin {Efecto de cortina de arriba a abajo}
  624.        For I1:=0 to 69 do
  625.         Begin
  626.          Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+(I1*640)+4))^,
  627.               Ptr($A000,(I1*640))^,320);
  628.          Delay(5);
  629.         End;
  630.        For I1:=70 Downto 1 do
  631.         Begin
  632.          Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+((I1*640)-320)+4))^,
  633.               Ptr($A000,((I1*640)-320))^,320);
  634.          Delay(5);
  635.         End;
  636.       End;
  637.     2,5,8,9:Begin {Efecto de cortina de abajo a arriba}
  638.        For I1:=70 Downto 1 do
  639.         Begin
  640.          Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+((I1*640)-320)+4))^,
  641.               Ptr($A000,((I1*640)-320))^,320);
  642.          Delay(5);
  643.         End;
  644.        For I1:=0 to 69 do
  645.         Begin
  646.          Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+(I1*640)+4))^,
  647.               Ptr($A000,(I1*640))^,320);
  648.          Delay(5);
  649.         End;
  650.       End;
  651.     3,7:Begin { Cuadritos }
  652.        For I2:=1 to 9 do
  653.         Begin
  654.          I1:=10;
  655.          Repeat
  656.           J1:=10;
  657.           Repeat
  658.            For I3:=(J1-I2) to (J1+I2) do
  659.             Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(I3*320)+(I1-I2)))^,
  660.                  Ptr($A000,((I3*320)+(I1-I2)))^,(I2*2));
  661.            Inc(J1,20);
  662.           Until J1=150;
  663.           Inc(I1,20);
  664.          Until I1=330;
  665.         End;
  666.        PintaPantalla(Pantalla2);
  667.       End;
  668.     4:Begin {Cuadros en cascada}
  669.        SetFillStyle(1,0);
  670.        For I2:=1 to 22 do
  671.         Begin
  672.          For I1:=1 to 16 do
  673.           For J1:=1 to 7 do
  674.            Begin
  675.             If ((I1+J1)=(I2+1))
  676.              Then
  677.               Begin
  678.                For I3:=((J1-1)*20) to ((J1-1)*20+19) do
  679.                 Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(I3*320)+
  680.                      ((I1-1)*20)))^,Ptr($A000,((I3*320)+((I1-1)*20)))^,20);
  681.                Delay(8);
  682.               End;
  683.            End;
  684.         End;
  685.       End;
  686.     6:Begin {Fundido hacia fuera}
  687.        For I1:=70 Downto 0 do
  688.         For J1:=I1 to (139-I1) do
  689.          Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(J1*320)+I1))^,
  690.                      Ptr($A000,((J1*320)+I1))^,(319-(I1*2)));
  691.       End;
  692.    10:Begin {Cuadrados en zigzag}
  693.        For J1:=1 to 7 do
  694.         If ((J1 Mod 2)=0)
  695.          Then
  696.           For I1:=1 to 16 do
  697.            Begin
  698.             For J3:=((J1-1)*20) to ((J1-1)*20+19) do
  699.              Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(J3*320)+
  700.                   ((I1-1)*20)))^,Ptr($A000,((J3*320)+((I1-1)*20)))^,20);
  701.             Delay(8);
  702.            End
  703.          Else
  704.           For I1:=16 Downto 1 do
  705.            Begin
  706.             For J3:=((J1-1)*20) to ((J1-1)*20+19) do
  707.              Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(J3*320)+
  708.                   ((I1-1)*20)))^,Ptr($A000,((J3*320)+((I1-1)*20)))^,20);
  709.             Delay(8);
  710.            End;
  711.       End;
  712.    11:Begin {Cuadros en espiral}
  713.        SetFillStyle(1,0);
  714.        For I2:=0 to 3 do
  715.         Begin
  716.          J1:=1+I2;
  717.          For I1:=(1+I2) to (16-I2) do {Derecha}
  718.           Begin
  719.            For J3:=((J1-1)*20) to ((J1-1)*20+19) do
  720.              Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(J3*320)+
  721.                   ((I1-1)*20)))^,Ptr($A000,((J3*320)+((I1-1)*20)))^,20);
  722.            Delay(8);
  723.           End;
  724.          For J1:=(2+I2) to (7-I2) do {Abajo}
  725.           Begin
  726.            For J3:=((J1-1)*20) to ((J1-1)*20+19) do
  727.              Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(J3*320)+
  728.                   ((I1-1)*20)))^,Ptr($A000,((J3*320)+((I1-1)*20)))^,20);
  729.            Delay(8);
  730.           End;
  731.          For I1:=(16-I2) Downto (1+I2) do {izquierda}
  732.           Begin
  733.            For J3:=((J1-1)*20) to ((J1-1)*20+19) do
  734.              Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(J3*320)+
  735.                   ((I1-1)*20)))^,Ptr($A000,((J3*320)+((I1-1)*20)))^,20);
  736.            Delay(8);
  737.           End;
  738.          For J1:=(6-I2) Downto (2+I2) do {Arriba}
  739.           Begin
  740.            For J3:=((J1-1)*20) to ((J1-1)*20+19) do
  741.              Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(J3*320)+
  742.                   ((I1-1)*20)))^,Ptr($A000,((J3*320)+((I1-1)*20)))^,20);
  743.            Delay(8);
  744.           End;
  745.         End;
  746.       End;
  747.    12:Begin { Aleatorio }
  748.        For I1:=1 to 15000 do
  749.         Begin
  750.          I2:=Random(318);
  751.          J2:=Random(138);
  752.          Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(J2*320)+I2))^,
  753.               Ptr($A000,((J2*320)+I2))^,2);
  754.          Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+((J2+1)*320)+I2))^,
  755.               Ptr($A000,(((J2+1)*320)+I2))^,2);
  756.          I2:=Random(320);
  757.          J2:=Random(140);
  758.          Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(J2*320)+I2))^,
  759.               Ptr($A000,((J2*320)+I2))^,1);
  760.         End;
  761.        PintaPantalla(Pantalla2);
  762.       End;
  763.    13:Begin { cortina vertical a dcha}
  764.        For I1:=0 to 319 do
  765.         For J1:=0 to 139 do
  766.          Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(J1*320)+I1))^,
  767.               Ptr($A000,((J1*320)+I1))^,1);
  768.       End;
  769.    14:Begin { cortina vertical a izq}
  770.        For I1:=319 Downto 0 do
  771.         For J1:=0 to 139 do
  772.          Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(J1*320)+I1))^,
  773.               Ptr($A000,((J1*320)+I1))^,1);
  774.       End;
  775.    15:Begin {encendido de tele}
  776.        SetColor(255);
  777.        For J1:=160 Downto 0 do
  778.         Line(J1,69,(319-J1),69);
  779.        Delay(5);
  780.        For J1:=70 Downto 0 do
  781.         Begin
  782.          Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+J1*320))^,
  783.               Ptr($A000,(J1*320))^,320);
  784.          Move(Ptr(Seg(Pantalla2^),(Ofs(Pantalla2^)+4+(139-J1)*320))^,
  785.               Ptr($A000,((139-J1)*320))^,320);
  786.          Delay(2);
  787.         End;
  788.       End;
  789.    End;
  790.  SetColor(OldColor);
  791.  SetFillStyle(FillInfoMIO.Pattern,FillInfoMIO.Color);
  792. End;
  793.  
  794. Procedure CambiaBloqueRGB(PrimerColor:Byte;NumColores:Word;Var RGB);
  795. Begin
  796.   Asm
  797.     MOV    DX, 3DAh       { *************************** }
  798.     @vert1:               { *                         * }
  799.     IN     AL, DX         { *     SINCRONIZACION      * }
  800.     TEST   AL, 8          { *          CON            * }
  801.     JNE    @vert1         { *          EL             * }
  802.     @vert2:               { *        RETRACE          * }
  803.     IN     AL, DX         { *        VERTICAL         * }
  804.     TEST   AL, 8          { *                         * }
  805.     JE     @vert2         { *************************** }
  806.     PUSH  DS              { Salva DS, POR OBLIGACION }
  807.     LDS   SI, RGB         { DS:SI -> Dirección de la paleta }
  808.     MOV   AX, NumColores  { Número de colores a modificar }
  809.     MOV   CX, AX          { CX se utiliza de contador }
  810.     SHL   CX, 1           { CX = CX * 2 }
  811.     ADD   CX, AX          { CX = CX + AX = 3 * NumColores, Nº de bytes RGB }
  812.     MOV   AL, PrimerColor
  813.     MOV   DX, 3C8h
  814.     OUT   DX, AL          { 3C8h - Indica el primer registro RGB a modificar }
  815.     INC   DX              { 3C9h - Aqui se escriben los colores }
  816.     @OtraVez:
  817.     LODSB                 { Carga AL }
  818.     OUT   DX, AL          { Vuelca en 3C9h el valor del color RGB }
  819.     LOOP  @OtraVez        { Cambia otro plano de color }
  820.     POP   DS              { Restaura el DS }
  821.   End;
  822. End;
  823.  
  824. Procedure CambiaPaleta(DePaleta,APaleta:Paleta);
  825. Var
  826.  PalPaso:Paleta;
  827.  AuxPaso:ShortInt;
  828. Begin
  829.   PalPaso:=DePaleta;
  830.   For JPal:=32 DownTo 1 Do
  831.     Begin
  832.       For IPal:=0 To 255 Do
  833.        Begin
  834.         AuxPaso:=APaleta[IPal,1]-PalPaso[IPal,1];
  835.         If AuxPaso>0
  836.          Then PalPaso[IPal,1]:=PalPaso[IPal,1]+DatosFundido[AuxPaso,JPal]
  837.          Else PalPaso[IPal,1]:=PalPaso[IPal,1]-DatosFundido[-AuxPaso,JPal];
  838.         AuxPaso:= APaleta[IPal,2]-PalPaso[IPal,2];
  839.         If AuxPaso>0
  840.          Then PalPaso[IPal,2]:=PalPaso[IPal,2]+DatosFundido[AuxPaso,JPal]
  841.          Else PalPaso[IPal,2]:=PalPaso[IPal,2]-DatosFundido[-AuxPaso,JPal];
  842.         AuxPaso:=APaleta[IPal,3]-PalPaso[IPal,3];
  843.         If AuxPaso>0
  844.          Then PalPaso[IPal,3]:=PalPaso[IPal,3]+DatosFundido[AuxPaso,JPal]
  845.          Else PalPaso[IPal,3]:=PalPaso[IPal,3]-DatosFundido[-AuxPaso,JPal];
  846.         End;
  847.       CambiaBloqueRGB(0,256,PalPaso);
  848.     End;
  849. End;
  850.  
  851. Procedure Enciende_Luz;
  852. Var
  853.  FichPaleta:File;
  854.  PalPaso:Paleta;
  855. Begin
  856.  Assign(FichPaleta,'PALETAS.DAT');
  857.  {$I-} Reset(FichPaleta,1); {$I+}
  858.  If IOResult<>0 Then Halt(311);
  859.  Seek(FichPaleta,1536);
  860.  BlockRead(FichPaleta,PalPaso,768);
  861.  Close(FichPaleta);
  862.  For IPal:=201 to 255 do
  863.   Begin
  864.    PalPaso[IPal,1]:=Pal[IPal,1];
  865.    PalPaso[IPal,2]:=Pal[IPal,2];
  866.    PalPaso[IPal,3]:=Pal[IPal,3];
  867.   End;
  868.  CambiaPaleta(Pal,PalPaso);
  869.  Pal:=PalPaso;
  870. End;
  871.  
  872. Procedure Fundido_a_Negro_Total;
  873. Var
  874.  PalPaso:Paleta;
  875. Begin
  876.  For IPal:=0 To 255 Do
  877.   Begin
  878.    PalPaso[IPal,1]:=0;
  879.    PalPaso[IPal,2]:=0;
  880.    PalPaso[IPal,3]:=0;
  881.   End;
  882.  CambiaPaleta(Pal,PalPaso);
  883.  Pal:=PalPaso;
  884. End;
  885.  
  886. Procedure Fundido_a_Negro_Parcial(NumCol:Byte);
  887. Var PalPaso:Paleta;
  888. Begin
  889.  For IPal:=0 To NumCol Do
  890.   Begin
  891.    PalPaso[IPal,1]:=0;
  892.    PalPaso[IPal,2]:=0;
  893.    PalPaso[IPal,3]:=0;
  894.   End;
  895.  For IPal:=(NumCol+1) To 255 Do
  896.   Begin
  897.    PalPaso[IPal,1]:=Pal[IPal,1];
  898.    PalPaso[IPal,2]:=Pal[IPal,2];
  899.    PalPaso[IPal,3]:=Pal[IPal,3];
  900.   End;
  901.  CambiaPaleta(Pal,PalPaso);
  902.  Pal:=PalPaso;
  903. End;
  904.  
  905. Procedure Fundido_de_Negro_Total(NumeroPaleta:Word;NombrePaleta:String8);
  906. Var
  907.  FichPaleta:File;
  908.  PalPaso,PalNegro:Paleta;
  909. Begin
  910.  If NumeroPaleta>0
  911.   Then
  912.    Begin
  913.     Assign(FichPaleta,'PALETAS.DAT');
  914.     {$I-} Reset(FichPaleta,1); {$I+}
  915.     If IOResult<>0 Then Halt(311);
  916.     Seek(FichPaleta,NumeroPaleta);
  917.     BlockRead(FichPaleta,PalPaso,768);
  918.     Close(FichPaleta);
  919.    End
  920.   Else
  921.    Begin
  922.     Assign(FichPaleta,NombrePaleta+'.PAL');
  923.     {$I-} Reset(FichPaleta,1); {$I+}
  924.     If IOResult<>0 Then Halt(311);
  925.     BlockRead(FichPaleta,PalPaso,768);
  926.     Close(FichPaleta);
  927.    End;
  928.  For IPal:=0 To 255 Do
  929.   Begin
  930.    PalNegro[IPal,1]:=0;
  931.    PalNegro[IPal,2]:=0;
  932.    PalNegro[IPal,3]:=0;
  933.   End;
  934.  CambiaPaleta(PalNegro,PalPaso);
  935.  Pal:=PalPaso;
  936. End;
  937.  
  938. Procedure Fundido_de_Negro_Parcial(NumCol:Byte);
  939. Var PalNegro:Paleta;
  940. Begin
  941.  For IPal:=0 To NumCol Do
  942.   Begin
  943.    PalNegro[IPal,1]:=0;
  944.    PalNegro[IPal,2]:=0;
  945.    PalNegro[IPal,3]:=0;
  946.   End;
  947.  For IPal:=(NumCol+1) To 255 Do
  948.   Begin
  949.    PalNegro[IPal,1]:=Pal[IPal,1];
  950.    PalNegro[IPal,2]:=Pal[IPal,2];
  951.    PalNegro[IPal,3]:=Pal[IPal,3];
  952.   End;
  953.  CambiaPaleta(PalNegro,Pal);
  954. End;
  955.  
  956. Procedure ActualizaPaleta(IndicePaleta:Byte);
  957. Begin
  958.  Case Parte_del_Juego of
  959.   1:Begin {animacion de paleta de las pantallas de la primera parte}
  960.      For IPal:=0 To 5 Do
  961.       Begin
  962.        Pal[(IPal+195),1]:=MovimientoPal[((IndicePaleta*6)+IPal),1];
  963.        Pal[(IPal+195),2]:=MovimientoPal[((IndicePaleta*6)+IPal),2];
  964.        Pal[(IPal+195),3]:=MovimientoPal[((IndicePaleta*6)+IPal),3];
  965.       End;
  966.      CambiaBloqueRGB(195,6,Pal[195,1]);
  967.     End;
  968.   2:Begin {reflejos del suelo de la segunda parte}
  969.     End;
  970.  End;
  971. End;
  972.  
  973. Procedure Procesando_Activo;
  974. Var
  975.  OldTexto:TextSettingsType;
  976. Begin
  977.  GetTextSettings(OldTexto);
  978.  SetTextStyle(Peque,HorizDir,4);
  979.  SetTextJustify(0,2);
  980.  SetRGBPalette(255,63,63,63);
  981.  SetColor(0);
  982.  OutTextXY(121,72,'PROCESANDO......');
  983.  OutTextXY(120,71,'PROCESANDO......');
  984.  OutTextXY(119,72,'PROCESANDO......');
  985.  OutTextXY(120,73,'PROCESANDO......');
  986.  SetColor(255);
  987.  OutTextXY(120,72,'PROCESANDO......');
  988.  SetTextStyle(OldTexto.Font,OldTexto.Direction,OldTexto.CharSize);
  989. End;
  990.  
  991. BEGIN
  992.  For IPal:=0 to 63 Do
  993.   For JPal:=1 to 64 Do
  994.    DatosFundido[IPal,JPal]:=IPal Div JPal;
  995.  Inicializa;
  996.  ExitGraph:=ExitProc;
  997.  ExitProc:=@GraphSalida;
  998. END.
  999.